package cn.tannn.cat.file.sdk.utils;


import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.UUID;

/**
 * @author <a href="https://t.tannn.cn/">tnnn</a>
 * @version V1.0
 * @date 2024/7/15 下午8:18
 */
@Slf4j
public class FileUtils {

    static String DEFAULT_MIME_TYPE = "application/octet-stream";

    /**
     * 获取文件 content type
     *
     * @param filename 文件名
     * @return content type
     */
    public static String getMimeType(String filename) {
        FileNameMap fileNameMap = URLConnection.getFileNameMap();
        String content = fileNameMap.getContentTypeFor(filename);
        return content == null ? DEFAULT_MIME_TYPE : content;
    }

    /**
     * 在指定上传的路径下生数字开头字母结尾的两位文件夹名，用于块存储（文件名是uuid两位前缀就是这个样子
     * <p> 块存储（效率最高）
     *
     * @param uploadPath 文件存储的路径
     */
    public static void init(String uploadPath) {
        File dir = new File(uploadPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        for (int i = 0; i < 256; i++) {
            String subdir = String.format("%02x", i);
            File file = new File(uploadPath + "/" + subdir);
            if (!file.exists()) {
                file.mkdirs();
            }
        }
        log .info("初始化本地文件存储块目录成功：{}", uploadPath);
    }

    /**
     * 文件名称转 UUID
     *
     * @param file 文件名称
     * @return UUID
     */
    public static String getUUIDFile(String file) {
        return UUID.randomUUID() + getExt(file);
    }

    /**
     * 文件扩展名（类型后缀
     *
     * @param originalName 文件名称
     * @return 后缀
     */
    public static String getExt(String originalName) {
        return originalName.substring(originalName.lastIndexOf("."));
    }


    /**
     * 截取文件名生成（子文件夹）
     *
     * @param file 文件名(原始文件名
     * @return 文件夹
     */
    public static String getSubdir(String file) {
        String uuidFile = getUUIDFile(file);
        return uuidFile.substring(0, 2);
    }

    /**
     * 默认的过期时间 7天
     *
     * @return 过期时间 秒
     */
    public static Integer defExpires() {
        return 7 * 24 * 60 * 60; // 7天换算成秒
    }
    /**
     * 默认的过期时间 7天
     *
     * @return 过期时间 秒
     */
    public static Integer defExpires(Integer expires) {
        if(expires == null){
            return 7 * 24 * 60 * 60; // 7天换算成秒
        }
        return expires;
    }



    /**
     * 规范化路径，以/开头，多个/替换为一个/
     *
     * @param filePath 文件相对路径
     * @return java.lang.String
     * @author lxw
     * @date 2024/12/5 10:45
     **/
    public static String proPath(String filePath) {
        filePath = filePath.replace("\\", "/");
        // 多个/替换为一个/
        filePath = filePath.replaceAll("(/)\\1{1,}", "$1");
        return filePath;
    }
}
